package Day_0203.MYSQL;

/**
 * @author zxc
 * @date 2023/02/03 22:06
 **/
public class Concurrent_Transactions {
    public static void main(String[] args) {
        /**
         * 并发事务所带来的问题
         * ===》
         * 在典型的应用程序中，多个事务并发运行，经常会操作相同的数据来完成各自的任务（多个用户对同一数据进行操作）。
         *
         * 并发事务所导致的问题 ：
         * 1.脏读（Dirty read）:
         * （1）当一个事务正在访问数据并且对数据进行了修改，而这种修改还没有提交到数据库中，这时另外一个事务也访问了这个数据，然后使用了这个数据。
         * （2）因为这个数据是还没有提交的数据，那么另外一个事务读到的这个数据是“脏数据”，依据“脏数据”所做的操作可00能是不正确的。
         *  ===》
         *  简单来说，就是某个事务读取到另一个事务尚未提交但同时已经被修改过的数据;
         *
         * 2.丢失修改（Lost to modify）:
         * （1）指在一个事务读取一个数据时，另外一个事务也访问了该数据，那么在第一个事务中修改了这个数据后，第二个事务也修改了这个数据。
         * （2）这样第一个事务内的修改结果就被丢失，因此称为丢失修改。
         *  例如：事务1读取某表中的数据A=20，事务2也读取A=20，事务1修改A=A-1，事务2也修改A=A-1，最终结果A=19，事务1的修改被丢失。
         *  ===>
         *  简单来说，就是某个事务修改的结果被另一个并发事务修改的结果所覆盖;
         *
         * 3.不可重复读（Unrepeatableread）:
         * （1）指在一个事务内多次读同一数据。在这个事务还没有结束时，另一个事务也访问该数据。
         * （2）那么，在第一个事务中的两次读数据之间，由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。
         * （3）这就发生了在一个事务内两次读到的数据是不一样的情况，因此称为不可重复读。
         *  ===>
         *  简单来说，就是在某个事务中，前后两次读取同一条记录所获得的结果是不一致的;
         *
         * 4.幻读（Phantom read）:
         * （1）幻读与不可重复读类似。它发生在一个事务（T1）读取了几行数据，接着另一个并发事务（T2）插入了一些数据时。
         * （2）在随后的查询中，第一个事务（T1）就会发现多了一些原本不存在的记录，就好像发生了幻觉一样，所以称为幻读。
         *  ===》
         *  简单来说，就是某个事务中，前后读取多条记录时，发现多出了一些原本不存在的记录;
         *  （即，在该事务执行过程中，其他事务向表中新增记录，同时被当前正在执行的事务所读取到;）
         *
         *
         * ===》
         * 不可重复读和幻读区别：
         * （1）不可重复读的重点是修改记录，比如多次读取一条记录发现其中某些列的值被修改;
         * （2）幻读的重点在于新增或者删除记录，比如多次读取一条记录发现记录增多或减少了;
         *
         */
    }
}
